﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using Iesi.Collections;
using Iesi.Collections.Generic;

namespace TestKontrole2 {
    public class RevizijskiCiklus {

        private const double POSTO_DODATNIH_STAVKI = 5.0; //kolicina dodatnih stavki u odnosu na osnovni uzorak
        private int id;
        private string cilj;
        private DateTime datum;
        private string naziv;
        private string opisJediniceUzorka;


        private Klijent klijent;
        private Populacija ekipa;

        private ISet<Kontrola> kontroleCiklusa;
        private Uzorak uzorak;

        virtual public string Naziv {
            get { return naziv; }
            set { naziv = value; }
        }
        virtual public string Cilj {
            get { return cilj; }
            set { cilj = value; }
        }
        virtual public DateTime Datum {
            get { return datum; }
            set { datum = value; }
        }
        virtual public Populacija Populacija {
            get { return ekipa; }
            set { ekipa = value; }
        }
        virtual public string OpisJediniceUzorka {
            get { return opisJediniceUzorka; }
            set { opisJediniceUzorka = value; }
        }

        virtual public int Id{
            get { return id; }
            set { id = value; }
        }

        public Klijent Klijent{
            get { return klijent; }
            set { klijent = value; }
        }

        public ISet<Kontrola> KontroleCiklusa{
            get { return kontroleCiklusa; }
            set { kontroleCiklusa = value; }
        }
        

        public RevizijskiCiklus() {
            this.datum = DateTime.Now;
            KontroleCiklusa = new HashedSet<Kontrola>();
        }
        public RevizijskiCiklus(Klijent klijent, string cilj)
            : this() {
            this.Klijent = klijent;
            this.cilj = cilj;
        }
        public RevizijskiCiklus(Populacija populacija)
            : this() {
            this.ekipa = populacija;
        }
        public RevizijskiCiklus(Populacija populacija, ISet<Kontrola> kontrole) :
            this(populacija) {
            setKontrole(kontrole);
        }
        public RevizijskiCiklus(Klijent klijent, string cilj, string opisJedinice, DateTime datum, Populacija populacija, ISet<Kontrola> kontrole):
            this(populacija,kontrole){
            this.Klijent = klijent;
            this.cilj = cilj;
            this.datum = datum;
            this.opisJediniceUzorka = opisJedinice;
            proces();


        }

        private void proces() {
            foreach (Kontrola item in KontroleCiklusa) {
                int brojUzorka = item.getVelicinaUzorka();
                item.setUzorak(getUzorakKontrole(brojUzorka));
            }
        }

        public Uzorak getUzorakKontrole(int velicina) {
            return uzorak.podskupUzorka(velicina);
        }

        /// <summary>
        /// velicina najveceg od uzoraka koji su potrebni kontrolama u jednom revizijskom ciklusu
        /// </summary>
        public int getVelicinaUzorka() {
            return uzorak.getVelicinaSkupa();
        }

        public void setKontrole(ISet<Kontrola> kontrole) {
            int maxBroj = 0;
            foreach (Kontrola item in kontrole) {
                KontroleCiklusa.Add(item);
                if (item.getVelicinaUzorka() > maxBroj)
                    maxBroj = item.getVelicinaUzorka();
            }
            uzorak = ekipa.createUzorak(maxBroj, determinateBrojDS(maxBroj));
        }
        public ISet<Kontrola> getKontrole() {
            return KontroleCiklusa;
        }
        public void setKontrola(Kontrola kontrola) {
            int maxBroj = 0;
            KontroleCiklusa.Add(kontrola);
            if (kontrola.getVelicinaUzorka() > maxBroj)
                maxBroj = kontrola.getVelicinaUzorka();
            uzorak = ekipa.createUzorak(maxBroj, determinateBrojDS(maxBroj));
        }
        private int determinateBrojDS(int maxBroj) {
            return (int)(Math.Floor(maxBroj / 100 * POSTO_DODATNIH_STAVKI) + 1);
        }

        public void addKontrola(Kontrola kontrola) {
            int novaVelicina = kontrola.getVelicinaUzorka();
            if (novaVelicina <= uzorak.getVelicinaSkupa()) {
                KontroleCiklusa.Add(kontrola);
            } else {
                uzorak = ekipa.expandUzorak(uzorak, novaVelicina, determinateBrojDS(novaVelicina));
            }
        }
        // override object.Equals
        public override bool Equals(object obj) {
            //       
            // See the full list of guidelines at
            //   http://go.microsoft.com/fwlink/?LinkID=85237  
            // and also the guidance for operator== at
            //   http://go.microsoft.com/fwlink/?LinkId=85238
            //

            if (obj == null || GetType() != obj.GetType()) {
                return false;
            }

            if (((RevizijskiCiklus)obj).Naziv.Equals(Naziv)) {
                return true;
            } else
                return false;
        }

        // override object.GetHashCode
        public override int GetHashCode() {

            return Naziv.GetHashCode();
        }

    }
}
